import { IBreadcrumb } from '@/base-ui/breadcrumb'
import menu from '@/router/main/system/menu/menu'
import { RouteLocationRaw, RouteRecordRaw } from 'vue-router'

let defaultMenu: any = null

export function mapMenus2Routes(userMenus: any[]): RouteRecordRaw[] {
  const routes: RouteRecordRaw[] = []
  const allRoutes: RouteRecordRaw[] = []
  // 查询获取目录 src/router/main 下的所有目录中的结尾是 .ts 的文件
  // 第二个参数 true 表示递归查找
  // 第三个参数是正则表达式，表示寻找符合条件的文件
  // require.context 是 webpack 提供的
  const cmptFiles = require.context('../router/main', true, /\.ts/)
  cmptFiles.keys().forEach((key) => {
    // 括号中是模块所在路径 - 加载文件为 commonJs 模块，然后将模块添加到 allRoutes
    const route = require('../router/main' + key.split('.')[1])
    allRoutes.push(route.default)
  }) // 根据项目目录的路由文件构建所有路由构成的数组

  // 通过递归遍历 userMenus 初始化对应的组件 - 上面通过读取本地目录是获取项目所有的路由
  // 但是用户权限是有限的，只将匹配的本地组件创建为路由
  const _resurseGetRoute = (userMenus: any[]) => {
    for (const menu of userMenus) {
      if (menu.type === 2) {
        // DB设计中该字段上=2表示是最终菜单项，如果是1表示有下级菜单项
        const route = allRoutes.find((item) => item.path === menu.url) //找到匹配的组件
        if (route) routes.push(route)
        if (!defaultMenu) defaultMenu = menu
      } else {
        // 如果不是菜单项则继续遍历其下属所有子菜单数组
        _resurseGetRoute(menu.children)
      }
    }
  }

  // 通过递归在所有路由中提取对应用户菜单项的路由并返回
  _resurseGetRoute(userMenus)

  return routes
}

/**
 * 2021年9月24日 09:27:12 chanchaw
 * 根据地址栏路径获取对应的菜单项对，用于设置选择选中菜单项
 * @param userMenus 用户菜单项的树形结构数据，所以要用到递归
 * @param currentPath 地址栏当前的路径
 * @returns 返回匹配当前路径的菜单项对象
 */
export function getMenu8Route(userMenus: any[], currentPath: string, breadcrumb?: IBreadcrumb[]): any {
  if (!userMenus) return null

  for (const menu of userMenus) {
    if (menu.type === 1) {
      const ret = getMenu8Route(menu.children ?? [], currentPath)

      if (ret) {
        breadcrumb?.push({ name: menu.name })
        breadcrumb?.push({ name: ret.name })
        return ret
      }
    } else if (menu.type === 2 && menu.url === currentPath) {
      // breadcrumb?.push({ name: `${menu.name}` })
      return menu
    }
  }
}

export function getMenuBreadcrumb(userMenus: any[], currentPath: string): IBreadcrumb[] | null {
  const breadcrumb: IBreadcrumb[] = []
  getMenu8Route(userMenus, currentPath, breadcrumb)

  return breadcrumb
}

/**
 * 根据当前路由路径构建面包屑数据 - 方法没有测试
 * @param userMenus 用户菜单数据 - 树形数据
 * @param currentPath 当前路由路径
 */
// export function getMenuBreadcrumb(userMenus: any[], currentPath: string): IBreadcrumb[] | null {
//   if (!userMenus) return null

//   const breadcrumb: IBreadcrumb[] = []
//   for (const menu of userMenus) {
//     if (menu.type === 1) {
//       const ret = getMenu8Route(menu.children ?? [], currentPath)

//       // 构建面包屑的上级内容
//       breadcrumb.push({ name: menu.name, path: menu.url })
//       breadcrumb.push({ name: ret.name, path: ret.url })
//       // if (ret) return ret
//     } else if (menu.type === 2 && menu.url === currentPath) {
//       breadcrumb.push({ name: menu.name, path: menu.url })
//       // return menu
//     }
//   }

//   return breadcrumb
// }

export function mapMenusToPermissions(userMenus: any[]) {
  const permissions: string[] = []
  const _recurseGetPermission = (menus: any[]) => {
    for (const menu of menus) {
      if (menu.type === 1 || menu.type === 2) {
        _recurseGetPermission(menu.children ?? [])
      } else if (menu.type === 3) {
        permissions.push(menu.permissiont)
      }
    }
  }

  _recurseGetPermission(userMenus)
  return permissions
}

export { defaultMenu }
